﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;

namespace Quaack
{
    public class Gebruiker
    {
        // Vars
        public int ProfielID { get; set; }
        public string Gebruikersnaam { get; set; }
        public string Wachtwoord { get; set; }
        public string Profielschets { get; set; }
        public string Email { get; set; }
        public string AvatarLocatie { get; set; }
        public string Mobiel { get; set; }
        public bool Anoniem { get; set; }
        public bool Verificatielopend { get; set; }
        public DateTime VerificatielopendDatum { get; set; }
        public bool TijdelijkGeblokkeerd { get; set; }
        public DateTime TijdelijkGeblokkeerdDatum { get; set; }
        public bool PermanentGeblokkeerd { get; set; }
        public DateTime PermanentGeblokkeerdDatum { get; set; }
        public bool Verwijderd { get; set; }
        public DateTime VerwijderdDatum { get; set; }
        

        // Interne functies
        /// <summary>
        /// Probeer een cast uit te voeren op de opgegeven datum
        /// </summary>
        /// <param name="datum">DateTime object</param>
        /// <returns>Indien de cast niet succesvol is, wordt de minvalue teruggegeven</returns>
        private DateTime ConverteerDatum(Object datum)
        {
            try
            {
                return (DateTime)datum;
            }
            catch
            {
                return DateTime.MinValue;
            }
        }

        // Publiekelijke functies

        /// <summary>
        /// Deze functie haalt een gebruiker op, op basis van een profielID.
        /// </summary>
        /// <param name="gebruikersID">De id van de gebruiker.</param>
        /// <returns>Een gebruikersobject.</returns>
        public Gebruiker GebruikerOpvragen(int profielID)
        {
            // Maak een nieuwe gebruikersobject aan
            Gebruiker gebruiker = new Gebruiker();

            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.profileTableAdapter profileAdapter = new DataLayer.quaackTableAdapters.profileTableAdapter();

            // Maak een nieuwe datatable en voer de statements uit met de opgegeven parameters
            DataTable dtProfiel = new DataTable();
            dtProfiel = profileAdapter.AccountOpvragen(profielID);

            // Indien er geen avatar is opgegeven, kan het pad naar de Quaack avatar worden gebruikt
            if (dtProfiel.Rows.Count > 0 && (string)dtProfiel.Rows[0]["avatarlocation"] != string.Empty)
            {
                gebruiker.AvatarLocatie = (string)dtProfiel.Rows[0]["avatarlocation"];
            }
            else
            {
                gebruiker.AvatarLocatie = "../Content/images/Quaack logo.png";
            }

            // Vul alle overige attributen van het gebruikersobject
            gebruiker.Email = (string)dtProfiel.Rows[0]["email"];
            gebruiker.Gebruikersnaam = (string)dtProfiel.Rows[0]["username"];
            gebruiker.Mobiel = (string)dtProfiel.Rows[0]["mobilenumber"];
            gebruiker.PermanentGeblokkeerd = (bool)dtProfiel.Rows[0]["permblocked"];
            gebruiker.PermanentGeblokkeerdDatum = ConverteerDatum(dtProfiel.Rows[0]["permblockeddatetime"]);
            gebruiker.ProfielID = (int)(dtProfiel.Rows[0]["profileid"]);
            gebruiker.Profielschets = (string)dtProfiel.Rows[0]["profile"];
            gebruiker.TijdelijkGeblokkeerd = (bool)dtProfiel.Rows[0]["tempblocked"];
            gebruiker.TijdelijkGeblokkeerdDatum = ConverteerDatum(dtProfiel.Rows[0]["tempblockeddatetime"]);
            gebruiker.Verificatielopend = (bool)dtProfiel.Rows[0]["verificationpending"];
            gebruiker.VerificatielopendDatum = ConverteerDatum(dtProfiel.Rows[0]["verificationpendingdatetime"]);
            gebruiker.Verwijderd = (bool)dtProfiel.Rows[0]["removed"];
            gebruiker.VerwijderdDatum = ConverteerDatum(dtProfiel.Rows[0]["removeddatetime"]);
            gebruiker.Wachtwoord = (string)dtProfiel.Rows[0]["password"];

            // Geef het gebruikersobject terug
            return gebruiker;
        }

        /// <summary>
        /// Deze functie haalt een gebruiker op, op basis van een gebruikersnaam.
        /// </summary>
        /// <param name="gebruikersnaam">De exacte naam van de gebruiker.</param>
        /// <returns>Een gebruikersobject.</returns>
        public Gebruiker GebruikerOpvragen(string gebruikersnaam)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.profileTableAdapter profileAdapter = new DataLayer.quaackTableAdapters.profileTableAdapter();

            return GebruikerOpvragen((int)profileAdapter.AccountIDOpvragen(gebruikersnaam));
        }

        /// <summary>
        /// Met deze functie kan een profiel worden aangemaakt.
        /// </summary>
        /// <param name="gebruiker">De aan te maken gebruiker</param>
        public void ProfielAanmaken(Gebruiker gebruiker)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.profileTableAdapter profileAdapter = new DataLayer.quaackTableAdapters.profileTableAdapter();

            // Voer de statements uit met de opgegeven parameters
            profileAdapter.AccountMaken(gebruiker.Gebruikersnaam, gebruiker.Wachtwoord, gebruiker.Profielschets, gebruiker.Email, gebruiker.AvatarLocatie, gebruiker.Mobiel.ToString());
        }

        /// <summary>
        /// Met deze functie kan een profiel worden gewijzigd.
        /// </summary>
        /// <param name="gebruiker">Het te wijzigen gebruikersobject</param>
        public void ProfielWijzigen(Gebruiker gebruiker)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.profileTableAdapter profileAdapter = new DataLayer.quaackTableAdapters.profileTableAdapter();

            // Voer de statements uit met de opgegeven parameters
            profileAdapter.AccountWijzigen(gebruiker.Gebruikersnaam, gebruiker.Wachtwoord, gebruiker.Profielschets, gebruiker.Email, gebruiker.AvatarLocatie, gebruiker.Mobiel.ToString(), gebruiker.ProfielID);
        }

        /// <summary>
        /// Met deze functie kan een profiel worden verwijderd.
        /// </summary>
        /// <param name="gebruiker">Het te verwijderen gebruikersobject</param>
        public void ProfielVerwijderen(Gebruiker gebruiker)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.profileTableAdapter profileAdapter = new DataLayer.quaackTableAdapters.profileTableAdapter();

            // Voer de statements uit met de opgegeven parameters
            profileAdapter.AccountVerwijderen(DateTime.Now, gebruiker.ProfielID);
        }

        /// <summary>
        /// Met deze functie kan een profiel worden geblokkeerd
        /// </summary>
        /// <param name="gebruiker"></param>
        public void ProfielBlokkeren(Gebruiker gebruiker)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.profileTableAdapter profileAdapter = new DataLayer.quaackTableAdapters.profileTableAdapter();

            // Voer de statements uit met de opgegeven parameters
            profileAdapter.AccountBlokkeren(DateTime.Now, gebruiker.Gebruikersnaam);
        }

        /// <summary>
        /// Met deze functie kan een profiel worden gedeblokkeerd
        /// </summary>
        /// <param name="gebruiker"></param>
        public void ProfielDeblokkeren(Gebruiker gebruiker)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.profileTableAdapter profileAdapter = new DataLayer.quaackTableAdapters.profileTableAdapter();

            // Voer de statements uit met de opgegeven parameters
            profileAdapter.AccountDeblokkeren(gebruiker.Gebruikersnaam);

        }

        /// <summary>
        /// Met deze functie kan het wachtwoord van de opgegeven gebruiker worden opgevraagd.
        /// </summary>
        /// <param name="gebruiker">De gebruiker waarvan het wachtwoord moet worden opgehaald</param>
        public void WachtwoordOpvragen(Gebruiker gebruiker)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.profileTableAdapter profileAdapter = new DataLayer.quaackTableAdapters.profileTableAdapter();

            // Voer de statements uit met de opgegeven parameters
            profileAdapter.WachtwoordOpvragen(gebruiker.Gebruikersnaam);
        }

        /// <summary>
        /// Met deze functie kan een gebruiker worden geblokkeerd
        /// </summary>
        /// <param name="gebruiker">De gebruiker die iemand wenst te blokkeren</param>
        /// <param name="doelgebruiker">De gebruiker die wordt geblokkeerd</param>
        public void GebruikerBlokkeren(Gebruiker gebruiker, Gebruiker doelgebruiker)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.followerTableAdapter followerAdapter = new DataLayer.quaackTableAdapters.followerTableAdapter();

            // Voer de statements uit met de opgegeven parameters
            followerAdapter.DeblokkeerGebruiker(gebruiker.ProfielID, doelgebruiker.ProfielID);
            followerAdapter.BlokkeerGebruiker(gebruiker.ProfielID, doelgebruiker.ProfielID);

            // Notitie:
            // Deze methodiek verwijdert de oude rij indien aanwezig, en voegt weer een nieuwe toe.
            // Met deze sql statements worden de opdrachten beperkt omdat er niet eerst hoeft te worden gecontroleerd of er een rij aanwezig is.
            // Middels SP's zou er aan de kant van de database een check worden uitgevoerd om te bepalen of een nieuwe rij
            // moet worden toegevoegd of geupdatet, maar voor deze opdracht werd dat als overtollig beschouwd omdat we
            // de queries graag in de datasets op wilden slaan, en deze ondersteunen helaas geen complexere statements die dit mogelijk maken.
        }

        /// <summary>
        /// Met deze functie kan een gebruiker worden gedeblokkeerd
        /// </summary>
        /// <param name="gebruiker">De gebruiker die iemand wenst te deblokkeren</param>
        /// <param name="doelgebruiker">De gebruiker die wordt gedeblokkeerd</param>
        public void GebruikerDeblokkeren(Gebruiker gebruiker, Gebruiker doelgebruiker)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.followerTableAdapter followerAdapter = new DataLayer.quaackTableAdapters.followerTableAdapter();

            // Voer de statements uit met de opgegeven parameters
            followerAdapter.DeblokkeerGebruiker(gebruiker.ProfielID, doelgebruiker.ProfielID);
        }

        /// <summary>
        /// Met deze functie kan worden gecontroleerd of een bepaalde gebruiker wel of niet is geblokkeerd.
        /// </summary>
        /// <param name="gebruiker">De gebruiker die wilt weten of ie is geblokkeerd</param>
        /// <param name="doelgebruiker">De gebruiker waarvan we willen weten of deze een blokkade heeft ingesteld.</param>
        public bool GebruikerIsGeblokkeerd(Gebruiker gebruiker, Gebruiker doelgebruiker)
        {
            // Maak een nieuwe instantie van de quaackTableAdapter aan
            DataLayer.quaackTableAdapters.followerTableAdapter followerAdapter = new DataLayer.quaackTableAdapters.followerTableAdapter();
            
            DataTable dtGeblokkeerdeGebruikers = followerAdapter.GebruikerGeblokkeerd(doelgebruiker.ProfielID, gebruiker.ProfielID);

            // Voer de statements uit met de opgegeven parameters
            if (dtGeblokkeerdeGebruikers.Rows.Count > 0 && (bool)dtGeblokkeerdeGebruikers.Rows[0]["blocked"])
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}